home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Workbench Design
/
WB Collection.iso
/
workbench werkzeuge
/
bildschirmschoner
/
beyondthedark
/
developer
/
source
/
btdlibstuff.asm
< prev
next >
Wrap
Assembly Source File
|
1996-04-07
|
4KB
|
259 lines
;
; Beyond The Dark: Generic Library Startup Code
;
; (c) Copyright 1995 Matthias Scheler
; All Rights Reserved
;
CSECT text,0
NOLIST
INCLUDE "exec/types.i"
INCLUDE "exec/libraries.i"
INCLUDE "exec/resident.i"
INCLUDE "exec/initializers.i"
INCLUDE "exec/semaphores.i"
INCLUDE "dos/dos.i"
LIST
; Macros
XLIB: MACRO
XREF _LVO\1
ENDM
CALL: MACRO
jsr _LVO\1(a6)
ENDM
; External References
XREF _LinkerDB
XREF _MyBlankerName
XREF _MyBlankerID
XREF _MyBlankerLibInit
XREF _MyBlankerLibFree
XREF _QueryMyBlanker
XREF _InitMyBlanker
XREF _EndMyBlanker
XREF _AnimMyBlanker
XREF _PenCountMyBlanker
XLIB Remove
XLIB FreeMem
XLIB CloseLibrary
XLIB OpenLibrary
XLIB InitSemaphore
XLIB ObtainSemaphore
XLIB ReleaseSemaphore
; External Definitions
XDEF _SysBase
; Our Library Structure
STRUCTURE BTDBase,LIB_SIZE
BPTR BB_SegList
STRUCT BB_Semaphore,SS_SIZE
LABEL BB_SIZE
; Program Code
moveq #-1,d0
rts
; Library Resident Module Tag
LibResTag: dc.w RTC_MATCHWORD
dc.l LibResTag
dc.l LibResTag+RT_SIZE
dc.b RTF_AUTOINIT
dc.b VERSION
dc.b NT_LIBRARY
dc.b 0
dc.l _MyBlankerName,_MyBlankerID
dc.l LibInit
; Initialization Table for Library Structure
LibInit: dc.l BB_SIZE
dc.l FuncTab
dc.l DataTab
dc.l Init
FuncTab: dc.l Open
dc.l Close
dc.l Expunge
dc.l ReturnNull
dc.l QueryMyBlanker
dc.l InitMyBlanker
dc.l EndMyBlanker
dc.l AnimMyBlanker
dc.l PenCountMyBlanker
dc.l -1
DataTab: INITBYTE LN_TYPE,NT_LIBRARY
INITLONG LN_NAME,_MyBlankerName
INITBYTE LIB_FLAGS,LIBF_SUMUSED+LIBF_CHANGED
INITWORD LIB_VERSION,VERSION
INITWORD LIB_REVISION,REVISION
INITLONG LIB_IDSTRING,_MyBlankerID
dc.l 0
; Init Function
Init: movem.l a4/a5,-(sp)
lea _LinkerDB,a4
move.l d0,a5
move.l a0,BB_SegList(a5)
move.l a6,_SysBase(a4)
lea BB_Semaphore(a5),a0
CALL InitSemaphore
move.l a5,d0
movem.l (sp)+,a4/a5
rts
; Open Function
Open: movem.l d2/a4-a6,-(sp)
lea _LinkerDB,a4
move.l a6,d2
move.l a6,a5
move.l _SysBase(a4),a6
lea BB_Semaphore(a5),a0
CALL ObtainSemaphore
addq.w #1,LIB_OPENCNT(a5)
bclr #LIBB_DELEXP,LIB_FLAGS(a5)
cmp.w #1,LIB_OPENCNT(a5)
bne.s InitDone
jsr _MyBlankerLibInit
tst.l d0
bne.s InitDone
subq.w #1,LIB_OPENCNT(a5)
moveq #0,d2
InitDone: lea BB_Semaphore(a5),a0
CALL ReleaseSemaphore
move.l d2,d0
movem.l (sp)+,d2/a4-a6
rts
; Close Function
Close: movem.l a4-a6,-(sp)
lea _LinkerDB,a4
move.l a6,a5
move.l _SysBase(a4),a6
lea BB_Semaphore(a5),a0
CALL ObtainSemaphore
subq.w #1,LIB_OPENCNT(a5)
bne.s KeepLibrary
jsr _MyBlankerLibFree
btst #LIBB_DELEXP,LIB_FLAGS(a6)
bne.s KeepLibrary
lea BB_Semaphore(a5),a0
CALL ReleaseSemaphore
movem.l (sp)+,a4-a6
bra.s TimeToGo
KeepLibrary: lea BB_Semaphore(a5),a0
CALL ReleaseSemaphore
movem.l (sp)+,a4-a6
ReturnNull: moveq #0,d0
rts
; Expunge Function
Expunge: tst.w LIB_OPENCNT(a6)
beq.s TimeToGo
bset #LIBB_DELEXP,LIB_FLAGS(a6)
bra.s ReturnNull
TimeToGo: movem.l d2/a4-a6,-(sp)
lea _LinkerDB,a4
move.l BB_SegList(a6),d2
move.l a6,a5
move.l a5,a1
move.l _SysBase(a4),a6
CALL Remove
move.l a5,a1
moveq #0,d0
move.w LIB_NEGSIZE(a5),d0
sub.w d0,a1
add.w LIB_POSSIZE(a5),d0
CALL FreeMem
move.l d2,d0
movem.l (sp)+,d2/a4-a6
rts
; own Library functions
; return BlankerInfo
QueryMyBlanker: lea _QueryMyBlanker(pc),a1
bra.s Stub
; create MyBlanker structure
InitMyBlanker: lea _InitMyBlanker(pc),a1
bra.s Stub
; free MyBlanker structure
EndMyBlanker: lea _EndMyBlanker(pc),a1
bra.s Stub
; count required pens
PenCountMyBlanker:
lea _PenCountMyBlanker(pc),a1
bra.s Stub
; draw a frame with MyBlanker structure
AnimMyBlanker: lea _AnimMyBlanker(pc),a1
; call C function
Stub: move.l a4,-(sp)
lea _LinkerDB,a4
move.l a0,-(sp)
jsr (a1)
addq.w #4,sp
move.l (sp)+,a4
rts
; Data
CSECT data,1
_SysBase: dc.l 0
END